#include "modbuswig.h"
#include "ui_modbuswig.h"

ModbusWig::ModbusWig(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ModbusWig)
{
    ui->setupUi(this);
    timer = new QTimer(this);

    // 提前刷新显式控件
    timeoutSlot();

    timer->setInterval(500);   // 设置时间间隔1秒钟
    timer->setSingleShot(false);    // 为周期循环

    // 连接信号槽要在启动定时器之前连接
    connect(timer,SIGNAL(timeout()),this,SLOT(timeoutSlot()));
    // 启动定时器
    timer->start();

    //控制按钮部分
    connect(ui->pushButtoneYHT,SIGNAL(clicked()),this,SLOT(Control()));//二氧化碳
    connect(ui->pushButtoneyQ,SIGNAL(clicked()),this,SLOT(Control()));//氧气
    connect(ui->pushButtonetF,SIGNAL(clicked()),this,SLOT(Control()));//通风
    connect(ui->pushButtonegG,SIGNAL(clicked()),this,SLOT(Control()));//灌溉
    connect(ui->pushButtonesF,SIGNAL(clicked()),this,SLOT(Control()));//施肥
}

ModbusWig::~ModbusWig()
{
    // 如果正在运行，则先关闭
    if(timer->isActive())
    {
        timer->stop();
    }

    delete timer;
    delete ui;
}

//控制开关槽函数
void ModbusWig::Control()
{
    if(sender() == ui->pushButtoneYHT)  //二氧化碳
    {
        if(QString::number(eyhtzhuangtai.toInt())=="1")
        {
            // 创建JSON对象
            QJsonObject jsonObject;
            // 添加控制指令类型
            jsonObject["type"] = QJsonValue(2);
            // 创建数据子对象
            QJsonObject dataObject;
            // 添加数据点唯一标识和数据点键值
            dataObject["key"] = QJsonValue(104);
            dataObject["val"] = QJsonValue("0");
            // 将数据子对象添加到主对象
            jsonObject["data"] = dataObject;
            // 创建QJsonDocument并添加JSON对象
            QJsonDocument jsonDoc(jsonObject);
            // 将JSON文档序列化为字符串
            QString jsonString = jsonDoc.toJson(QJsonDocument::Compact);
            // 创建一个QMQTT::Message对象
            QMQTT::Message message;
            message.setTopic("/app/data/down"); // 设置发布的主题
            message.setPayload(jsonString.toUtf8()); // 设置消息内容，注意转换
            message.setQos(1); // 设置服务质量等级
            // 使用MqttHandler实例发布消息
            quint16 messageId = GlobalVal::mqtt->publish(message);
            qDebug() << "Message published with ID" << messageId;
             ui->pushButtoneYHT->setText("启动制造二氧化碳");
        }
        if(QString::number(eyhtzhuangtai.toInt())=="0")
        {
            // 创建JSON对象
            QJsonObject jsonObject;
            // 添加控制指令类型
            jsonObject["type"] = QJsonValue(2);
            // 创建数据子对象
            QJsonObject dataObject;
            // 添加数据点唯一标识和数据点键值
            dataObject["key"] = QJsonValue(104);
            dataObject["val"] = QJsonValue("1");
            // 将数据子对象添加到主对象
            jsonObject["data"] = dataObject;
            // 创建QJsonDocument并添加JSON对象
            QJsonDocument jsonDoc(jsonObject);
            // 将JSON文档序列化为字符串
            QString jsonString = jsonDoc.toJson(QJsonDocument::Compact);
            // 创建一个QMQTT::Message对象
            QMQTT::Message message;
            message.setTopic("/app/data/down"); // 设置发布的主题
            message.setPayload(jsonString.toUtf8()); // 设置消息内容，注意转换
            message.setQos(1); // 设置服务质量等级
            // 使用MqttHandler实例发布消息
            quint16 messageId = GlobalVal::mqtt->publish(message);
            qDebug() << "Message published with ID" << messageId;
             ui->pushButtoneYHT->setText("制造二氧化碳已启动");
        }
    }
    if(sender() == ui->pushButtoneyQ)   //氧气
    {
        if(QString::number(yqzhuangtai.toInt())=="1")
        {
            // 创建JSON对象
            QJsonObject jsonObject;
            // 添加控制指令类型
            jsonObject["type"] = QJsonValue(2);
            // 创建数据子对象
            QJsonObject dataObject;
            // 添加数据点唯一标识和数据点键值
            dataObject["key"] = QJsonValue(105);
            dataObject["val"] = QJsonValue("0");
            // 将数据子对象添加到主对象
            jsonObject["data"] = dataObject;
            // 创建QJsonDocument并添加JSON对象
            QJsonDocument jsonDoc(jsonObject);
            // 将JSON文档序列化为字符串
            QString jsonString = jsonDoc.toJson(QJsonDocument::Compact);
            // 创建一个QMQTT::Message对象
            QMQTT::Message message;
            message.setTopic("/app/data/down"); // 设置发布的主题
            message.setPayload(jsonString.toUtf8()); // 设置消息内容，注意转换
            message.setQos(1); // 设置服务质量等级
            // 使用MqttHandler实例发布消息
            quint16 messageId = GlobalVal::mqtt->publish(message);
            qDebug() << "Message published with ID" << messageId;
            ui->pushButtoneyQ->setText("启动制造氧气");
        }
        if(QString::number(yqzhuangtai.toInt())=="0")
        {
            // 创建JSON对象
            QJsonObject jsonObject;
            // 添加控制指令类型
            jsonObject["type"] = QJsonValue(2);
            // 创建数据子对象
            QJsonObject dataObject;
            // 添加数据点唯一标识和数据点键值
            dataObject["key"] = QJsonValue(105);
            dataObject["val"] = QJsonValue("1");
            // 将数据子对象添加到主对象
            jsonObject["data"] = dataObject;
            // 创建QJsonDocument并添加JSON对象
            QJsonDocument jsonDoc(jsonObject);
            // 将JSON文档序列化为字符串
            QString jsonString = jsonDoc.toJson(QJsonDocument::Compact);
            // 创建一个QMQTT::Message对象
            QMQTT::Message message;
            message.setTopic("/app/data/down"); // 设置发布的主题
            message.setPayload(jsonString.toUtf8()); // 设置消息内容，注意转换
            message.setQos(1); // 设置服务质量等级
            // 使用MqttHandler实例发布消息
            quint16 messageId = GlobalVal::mqtt->publish(message);
            qDebug() << "Message published with ID" << messageId;
            ui->pushButtoneyQ->setText("制造氧气已启动");
        }
    }
    if(sender() == ui->pushButtonetF)   //通风
    {
        if(QString::number(dpzhuangtai.toInt())=="1")
        {
            // 创建JSON对象
            QJsonObject jsonObject;
            // 添加控制指令类型
            jsonObject["type"] = QJsonValue(2);
            // 创建数据子对象
            QJsonObject dataObject;
            // 添加数据点唯一标识和数据点键值
            dataObject["key"] = QJsonValue(106);
            dataObject["val"] = QJsonValue("0");
            // 将数据子对象添加到主对象
            jsonObject["data"] = dataObject;
            // 创建QJsonDocument并添加JSON对象
            QJsonDocument jsonDoc(jsonObject);
            // 将JSON文档序列化为字符串
            QString jsonString = jsonDoc.toJson(QJsonDocument::Compact);
            // 创建一个QMQTT::Message对象
            QMQTT::Message message;
            message.setTopic("/app/data/down"); // 设置发布的主题
            message.setPayload(jsonString.toUtf8()); // 设置消息内容，注意转换
            message.setQos(1); // 设置服务质量等级
            // 使用MqttHandler实例发布消息
            quint16 messageId = GlobalVal::mqtt->publish(message);
            qDebug() << "Message published with ID" << messageId;
            ui->pushButtonetF->setText("打开大棚棚顶");
        }
        if(QString::number(dpzhuangtai.toInt())=="0")
        {
            // 创建JSON对象
            QJsonObject jsonObject;
            // 添加控制指令类型
            jsonObject["type"] = QJsonValue(2);
            // 创建数据子对象
            QJsonObject dataObject;
            // 添加数据点唯一标识和数据点键值
            dataObject["key"] = QJsonValue(106);
            dataObject["val"] = QJsonValue("1");
            // 将数据子对象添加到主对象
            jsonObject["data"] = dataObject;
            // 创建QJsonDocument并添加JSON对象
            QJsonDocument jsonDoc(jsonObject);
            // 将JSON文档序列化为字符串
            QString jsonString = jsonDoc.toJson(QJsonDocument::Compact);
            // 创建一个QMQTT::Message对象
            QMQTT::Message message;
            message.setTopic("/app/data/down"); // 设置发布的主题
            message.setPayload(jsonString.toUtf8()); // 设置消息内容，注意转换
            message.setQos(1); // 设置服务质量等级
            // 使用MqttHandler实例发布消息
            quint16 messageId = GlobalVal::mqtt->publish(message);
            qDebug() << "Message published with ID" << messageId;
            ui->pushButtonetF->setText("大棚棚顶已打开");
        }
    }
    if(sender() == ui->pushButtonegG)   //灌溉
    {
        if(QString::number(ggzhuangtai.toInt())=="1")
        {
            // 创建JSON对象
            QJsonObject jsonObject;
            // 添加控制指令类型
            jsonObject["type"] = QJsonValue(2);
            // 创建数据子对象
            QJsonObject dataObject;
            // 添加数据点唯一标识和数据点键值
            dataObject["key"] = QJsonValue(107);
            dataObject["val"] = QJsonValue("0");
            // 将数据子对象添加到主对象
            jsonObject["data"] = dataObject;
            // 创建QJsonDocument并添加JSON对象
            QJsonDocument jsonDoc(jsonObject);
            // 将JSON文档序列化为字符串
            QString jsonString = jsonDoc.toJson(QJsonDocument::Compact);
            // 创建一个QMQTT::Message对象
            QMQTT::Message message;
            message.setTopic("/app/data/down"); // 设置发布的主题
            message.setPayload(jsonString.toUtf8()); // 设置消息内容，注意转换
            message.setQos(1); // 设置服务质量等级
            // 使用MqttHandler实例发布消息
            quint16 messageId = GlobalVal::mqtt->publish(message);
            qDebug() << "Message published with ID" << messageId;
            ui->pushButtonegG->setText("开启自动灌溉");
        }
        if(QString::number(ggzhuangtai.toInt())=="0")
        {
            // 创建JSON对象
            QJsonObject jsonObject;
            // 添加控制指令类型
            jsonObject["type"] = QJsonValue(2);
            // 创建数据子对象
            QJsonObject dataObject;
            // 添加数据点唯一标识和数据点键值
            dataObject["key"] = QJsonValue(107);
            dataObject["val"] = QJsonValue("1");
            // 将数据子对象添加到主对象
            jsonObject["data"] = dataObject;
            // 创建QJsonDocument并添加JSON对象
            QJsonDocument jsonDoc(jsonObject);
            // 将JSON文档序列化为字符串
            QString jsonString = jsonDoc.toJson(QJsonDocument::Compact);
            // 创建一个QMQTT::Message对象
            QMQTT::Message message;
            message.setTopic("/app/data/down"); // 设置发布的主题
            message.setPayload(jsonString.toUtf8()); // 设置消息内容，注意转换
            message.setQos(1); // 设置服务质量等级
            // 使用MqttHandler实例发布消息
            quint16 messageId = GlobalVal::mqtt->publish(message);
            qDebug() << "Message published with ID" << messageId;
            ui->pushButtonegG->setText("自动灌溉已开启");
        }
    }
    if(sender() == ui->pushButtonesF)   //施肥
    {
        if(QString::number(sfzhuangtai.toInt())=="1")
        {
            // 创建JSON对象
            QJsonObject jsonObject;
            // 添加控制指令类型
            jsonObject["type"] = QJsonValue(2);
            // 创建数据子对象
            QJsonObject dataObject;
            // 添加数据点唯一标识和数据点键值
            dataObject["key"] = QJsonValue(108);
            dataObject["val"] = QJsonValue("0");
            // 将数据子对象添加到主对象
            jsonObject["data"] = dataObject;
            // 创建QJsonDocument并添加JSON对象
            QJsonDocument jsonDoc(jsonObject);
            // 将JSON文档序列化为字符串
            QString jsonString = jsonDoc.toJson(QJsonDocument::Compact);
            // 创建一个QMQTT::Message对象
            QMQTT::Message message;
            message.setTopic("/app/data/down"); // 设置发布的主题
            message.setPayload(jsonString.toUtf8()); // 设置消息内容，注意转换
            message.setQos(1); // 设置服务质量等级
            // 使用MqttHandler实例发布消息
            quint16 messageId = GlobalVal::mqtt->publish(message);
            qDebug() << "Message published with ID" << messageId;
            ui->pushButtonesF->setText("开启自动施肥");
        }
        if(QString::number(sfzhuangtai.toInt())=="0")
        {
            // 创建JSON对象
            QJsonObject jsonObject;
            // 添加控制指令类型
            jsonObject["type"] = QJsonValue(2);
            // 创建数据子对象
            QJsonObject dataObject;
            // 添加数据点唯一标识和数据点键值
            dataObject["key"] = QJsonValue(108);
            dataObject["val"] = QJsonValue("1");
            // 将数据子对象添加到主对象
            jsonObject["data"] = dataObject;
            // 创建QJsonDocument并添加JSON对象
            QJsonDocument jsonDoc(jsonObject);
            // 将JSON文档序列化为字符串
            QString jsonString = jsonDoc.toJson(QJsonDocument::Compact);
            // 创建一个QMQTT::Message对象
            QMQTT::Message message;
            message.setTopic("/app/data/down"); // 设置发布的主题
            message.setPayload(jsonString.toUtf8()); // 设置消息内容，注意转换
            message.setQos(1); // 设置服务质量等级
            // 使用MqttHandler实例发布消息
            quint16 messageId = GlobalVal::mqtt->publish(message);
            qDebug() << "Message published with ID" << messageId;
            ui->pushButtonesF->setText("自动施肥已开启");
        }
    }
}

//显示时间
void ModbusWig::timeoutSlot()
{
    // 获取当前系统时间，转换为：时:分:秒
    QString str = QDateTime::currentDateTime().toString("hh:mm:ss");
    ui->lcdNumberTim->display(str);
}

void ModbusWig::dataUpSlot(QByteArray jsonData)//显示采集的数据
{
    QString value (jsonData);
    QJsonParseError jsonError;
    QJsonDocument doc = QJsonDocument::fromJson(value.toUtf8() ,&jsonError);
    if (jsonError.error != QJsonParseError::NoError && !doc.isNull())
    {
        qDebug() << "Json格式错误！" << jsonError.error;
        return;
    }
    QJsonObject rootObj = doc.object();
    QJsonValue modbusValue = rootObj.value("modbus");
    QJsonObject modbusObj = modbusValue.toObject();
    QJsonValue dataValue =modbusObj.value("data");
    QJsonArray data = dataValue.toArray();
    for (int i = 0; i < data.count(); i++)
    {
        QJsonValue dataValueChild = data.at(i);
        QJsonObject dataObj = dataValueChild.toObject();
        QJsonValue keyValue = dataObj.value("key");
        if(keyValue.toInt()== 101)
        {
            QJsonValue varValue = dataObj.value("val");
            ui->lcdNumberEyht->display(QString::number(varValue.toDouble()));//二氧化碳浓度
        }
        else if(keyValue.toInt()== 102)
        {
            QJsonValue varValue = dataObj.value("val");
            ui->lcdNumberYq->display(QString::number(varValue.toDouble()));//氧气浓度
        }
        else if(keyValue.toInt()== 103)
        {
            QJsonValue varValue = dataObj.value("val");
            ui->lcdNumberTr->display(QString::number(varValue.toDouble()));//土壤湿度
        }
        else if(keyValue.toInt()== 104)
        {
            QJsonValue varValue = dataObj.value("val");
            eyhtzhuangtai=varValue;//二氧化碳控制状态
        }
        else if(keyValue.toInt()== 105)
        {
            QJsonValue varValue = dataObj.value("val");
            yqzhuangtai=varValue;//氧气控制状态
        }
        else if(keyValue.toInt()== 106)
        {
            QJsonValue varValue = dataObj.value("val");
            dpzhuangtai=varValue;//大棚控制状态
        }
        else if(keyValue.toInt()== 107)
        {
            QJsonValue varValue = dataObj.value("val");
            ggzhuangtai=varValue;//自动灌溉控制状态
        }
        else if(keyValue.toInt()== 108)
        {
            QJsonValue varValue = dataObj.value("val");
            sfzhuangtai=varValue;//自动施肥控制状态
        }
    }
}

void ModbusWig::on_pushButton_clicked()//刷新数据
{
    // 创建JSON对象
    QJsonObject jsonObject;
    // 添加控制指令类型
    jsonObject["type"] = QJsonValue(1);
    // 创建QJsonDocument并添加JSON对象
    QJsonDocument jsonDoc(jsonObject);

    // 将JSON文档序列化为字符串
    QString jsonString = jsonDoc.toJson(QJsonDocument::Compact);

    // 创建一个QMQTT::Message对象
    QMQTT::Message message;
    message.setTopic("/app/data/down"); // 设置发布的主题
    message.setPayload(jsonString.toUtf8()); // 设置消息内容，注意转换
    message.setQos(1); // 设置服务质量等级

    // 使用MqttHandler实例发布消息
    quint16 messageId = GlobalVal::mqtt->publish(message);
    qDebug() << "Message published with ID" << messageId;
}
